package com.opengroupe.resources;

import java.util.ArrayList;
import java.util.List;

import javax.ws.rs.GET;
import javax.ws.rs.POST;
import javax.ws.rs.PUT;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.QueryParam;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.opengroupe.dto.CandidatDto;
import com.opengroupe.entities.Candidat;
import com.opengroupe.service.common.CrudService;
import com.opengroupe.service.pc.PCService;
import com.opengroupe.service.tablet.TabletService;
import com.opengroupe.utils.QrhWsUtils;

@Service("candidatResource")
@Path("/candidat")
public class CandidatResource  {
	
	@Autowired
	private PCService pcService;
	
	@Autowired
	private CrudService crudService;
	
	@Autowired
	private TabletService tabletService;
	
	private Gson gson = new GsonBuilder().serializeNulls().setPrettyPrinting().create();
	
	@PUT
	@Produces("application/json")
	@Path("/create")
	public synchronized String creerCandidat(String jCandidatDto) {
		
		CandidatDto candidatDto = gson.fromJson(jCandidatDto, CandidatDto.class);
		
		Candidat candidat = new Candidat();
		candidat = QrhWsUtils.convertCandidatDtoToCandidat(candidatDto);
		
		if((Candidat)crudService.read(candidat.getEmailCandidat(),Candidat.class.getCanonicalName()) == null) {
			try {
				candidat = tabletService.creerCandidat(candidat);
			} catch (Exception e) {
				return null;
			}
		} else {
			candidat = (Candidat) crudService.read(candidat.getEmailCandidat(), Candidat.class.getCanonicalName());
		}
		
		candidatDto = QrhWsUtils.convertCandidatToCandidatDto(candidat);
		
		return gson.toJson(candidatDto, CandidatDto.class);
	}

	@POST
	@Path("/delete")
	public synchronized void deleteCandidat(String emailCandidat) {
		pcService.deleteCandidat(emailCandidat);
	}
	
	@GET
	@Produces("application/json")
	@Path("/getAll")
	public synchronized String getAllCandidats(){
		
		@SuppressWarnings("unchecked")
		List<Candidat> candidats = 	(List<Candidat>) crudService.read(Candidat.class.getCanonicalName());
		
		List<CandidatDto> candidatDtos = new ArrayList<CandidatDto>();
		for(Candidat candidat : candidats){
			candidatDtos.add(QrhWsUtils.convertCandidatToCandidatDto(candidat));
		}
		
		return gson.toJson(candidatDtos);
	}
	
	@GET
	@Produces("application/json")
	@Path("/update")
	public synchronized String updateCandidat(
			@QueryParam("idCandidat") String idCandidat,
			@QueryParam("prenomCandidat") String prenomCandidat,
			@QueryParam("nomCandidat") String nomCandidat,
			@QueryParam("emailCandidat") String emailCandidat,
			@QueryParam("telephoneCandidat") String telephoneCandidat
			) {
		
		Gson gson = new GsonBuilder().serializeNulls().setPrettyPrinting().create();
		
		CandidatDto candidatDto = new CandidatDto(nomCandidat, prenomCandidat, emailCandidat, telephoneCandidat);
		candidatDto.setIdCandidat(Integer.parseInt(idCandidat));
		try {
			candidatDto = pcService.modifierCandidat(candidatDto);
		} catch (Exception e) {
			return null;
		}
		return gson.toJson(candidatDto, CandidatDto.class);
	}
}
